package main

import "fmt"

var sum int = 0

func main() {
	for i := 0; i < 5; i++ {
		fmt.Println(add(i))
	}
	results := Counter()          // 如果给了一个新的对象,那么结果就会重新定义
	fmt.Printf("%T\n", results()) //1
	fmt.Printf("result_main %c \n", results)
	fmt.Println(results()) //2
	fmt.Println(results()) //3
	fmt.Println(results()) //4
}

//全局变量
func add(num int) int {
	sum += num
	return sum
}

//闭包函数
func Counter() func() int {
	i := 0
	result := func() int {
		i++
		return i
	}
	fmt.Println("result", result)
	return result
}

/*
theme	闭包,编程思想,在一个函数中引入了一个匿名函数
	1:闭包是在其词法上下文中引用了自由变量的函数
	2:是由函数和其相关的引用环境组合而成的实体,函数+引用环境 = 闭包
	3.在某些语言中,称为lambda表达式
	优点
		1,加强模块化;
		2,抽象,简化代码
theme 可变参数
*/
